/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gruppenkalenderProjekt.kalenderinterface;

import gruppenkalenderProjekt.data.Benutzer;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.MutableComboBoxModel;
import layout.TableLayout;

/**
 *
 * @author Gruppe 2
 */
class Benutzeranlage implements ActionListener {
    // Interfaceclient starten bzw. Verbindung zur Verwaltung herstellen

    private InterfaceClient ic;
    private Vector<Benutzer> alleBenutzer;
    private Benutzer aktuellerBenutzer = null;
    // Strings initiieren
    private static String frameString = "Gruppenkalender Login";
    private static String benutzerAuswaehlenString = "Benutzer auswählen";
    private static String benutzernameString = "Benutzername";
    private static String vornameString = "Vorname";
    private static String nachnameString = "Nachname";
    private static String emailString = "E-Mail";
    private static String telefonString = "Telefon";
    private static String raumString = "Raum";
    private static String superbenutzerString = "Superbenutzer";
    private static String speichernButtonString = "Speichern";
    private static String abbrechenButtonString = "Schließen";
    private static String neuButtonString = "Neu";
    private static String loeschenButtonString = "Löschen";
    //Labels, Textfelder und Buttons initiieren
    final JLabel benutzerAuswaehlen = new JLabel(benutzerAuswaehlenString);
    final JComboBox benutzerComboBox = new JComboBox();
    final JLabel benutzername = new JLabel(benutzernameString);
    final JTextField benutzernameTextField = new JTextField();
    final JLabel vorname = new JLabel(vornameString);
    final JTextField vornameTextField = new JTextField();
    final JLabel nachname = new JLabel(nachnameString);
    final JTextField nachnameTextField = new JTextField();
    final JLabel email = new JLabel(emailString);
    final JTextField emailTextField = new JTextField();
    final JLabel telefon = new JLabel(telefonString);
    final JTextField telefonTextField = new JTextField();
    final JLabel raum = new JLabel(raumString);
    final JTextField raumTextField = new JTextField();
    final JButton speichernButton = new JButton(speichernButtonString);
    final JButton abbrechenButton = new JButton(abbrechenButtonString);
    final JButton neuButton = new JButton(neuButtonString);
    final JButton loeschenButton = new JButton(loeschenButtonString);
    final JCheckBox superbenutzerCheckBox = new JCheckBox(superbenutzerString);
    private JFrame frame = new JFrame(frameString);

    public JPanel generateComponents(GruppenkalenderInterface gki) throws RemoteException {

        ic = gki.getIC();
        alleBenutzer = ic.getAlleBenutzer();

        Container contentPane = frame.getContentPane();
        BorderLayout layout = new BorderLayout();
        contentPane.setLayout(layout);

        JPanel big = new JPanel(new BorderLayout());
        big.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Benutzer bearbeiten"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));


        // Panels
        double sizeInhalt[][] = {{125, 500}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {50, 360}};

        JPanel inhalt = new JPanel(new TableLayout(sizeInhalt));

        double sizeTexfield[][] = {{120, 15, 325}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {30, 10, 30, 10, 30, 10, 30, 10, 30, 10, 30, 10, 30, 10, 30}};

        JPanel texfield = new JPanel(new TableLayout(sizeTexfield));
        texfield.setBorder(
                BorderFactory.createCompoundBorder(
                BorderFactory.createTitledBorder("Benutzer auswählen / neu anlegen"),
                BorderFactory.createEmptyBorder(5, 5, 5, 5)));


        // Buttons
        double sizeButtons[][] = {{310, 100, 10, 100, 10, 100, 10, 100}, // Columns             275 Breite jeder Spalte (Komischerweise wird nur eine Spalte alleine nicht gesetzt)
            {130, 25}};           // Rows                 Höhe jeder Zeile (35=Buttongröße, 15=Leerzeile)

        JPanel bottom = new JPanel(new TableLayout(sizeButtons));

        texfield.add(benutzerAuswaehlen, "0,0");
        texfield.add(benutzerComboBox, "2,0");
        texfield.add(benutzername, "0,2");
        texfield.add(benutzernameTextField, "2,2");
        texfield.add(vorname, "0,4");
        texfield.add(vornameTextField, "2,4");
        texfield.add(nachname, "0,6");
        texfield.add(nachnameTextField, "2,6");
        texfield.add(email, "0,8");
        texfield.add(emailTextField, "2,8");
        texfield.add(telefon, "0,10");
        texfield.add(telefonTextField, "2,10");
        texfield.add(raum, "0,12");
        texfield.add(raumTextField, "2,12");
        texfield.add(superbenutzerCheckBox, "2,14");


        //OnButtonClick
        benutzerComboBox.addActionListener(this);
        benutzerComboBox.setActionCommand("LeseAus");
        //OnButtonClick
        neuButton.addActionListener(this);
        neuButton.setActionCommand("Neu");
        //OnButtonClick
        speichernButton.addActionListener(this);
        speichernButton.setActionCommand("Speichern");
        //OnButtonClick
        loeschenButton.addActionListener(this);
        loeschenButton.setActionCommand("Löschen");
        //OnButtonClick
        abbrechenButton.addActionListener(gki);
        abbrechenButton.setActionCommand("Abbrechen");


        bottom.add(neuButton, "1,1");
        bottom.add(speichernButton, "3,1");
        bottom.add(loeschenButton, "5,1");
        bottom.add(abbrechenButton, "7,1");

        inhalt.add(texfield, "1,1");
        big.add(inhalt, BorderLayout.NORTH);
        big.add(bottom, BorderLayout.PAGE_END);

        this.setDropdownMenuForBenutzer();

        contentPane.add(big);
        return (JPanel) contentPane;

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getActionCommand().equals("LeseAus")) {
            try {
                this.setTextfeld();
            } catch (RemoteException ex) {
                Logger.getLogger(Benutzeranlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


        if (e.getActionCommand().equals("Neu")) {
            try {
                this.leereAlleFelder();
            } catch (RemoteException ex) {
                Logger.getLogger(Benutzeranlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Speichern")) {
            try {
                if (aktuellerBenutzer != null) {

                    this.speichereAktuellenBenutzer();


                } else {
                    this.neuenBenutzerAnlegen();
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Benutzeranlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        if (e.getActionCommand().equals("Löschen")) {
            try {
                if (aktuellerBenutzer != null) {
                    this.benutzerLoeschen();

                } else {
                    String message = (String) (("Bitte wählen Sie einen Benutzer aus"));
                    JOptionPane.showMessageDialog(null, message, "Löschen nicht erfolgreich", 2, null);
                }

            } catch (RemoteException ex) {
                Logger.getLogger(Benutzeranlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }


    }

    public void setDropdownMenuForBenutzer() {
        if (benutzerComboBox.getItemCount() != 0) {
            benutzerComboBox.removeAllItems();
        }
        benutzerComboBox.addItem("Benutzer auswählen");
        for (int i = 0; i < alleBenutzer.size(); i++) {
            try {
                benutzerComboBox.addItem(alleBenutzer.elementAt(i).getBenutzername());
            } catch (RemoteException ex) {
                Logger.getLogger(Benutzeranlage.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        benutzerComboBox.addActionListener(this);
        aktuellerBenutzer = null;
    }

    public void leereAlleFelder() throws RemoteException {
        aktuellerBenutzer = null;
        benutzernameTextField.setText("");
        vornameTextField.setText("");
        nachnameTextField.setText("");
        emailTextField.setText("");
        telefonTextField.setText("");
        raumTextField.setText("");
        benutzerComboBox.setSelectedItem(benutzerComboBox.getItemAt(0));
        superbenutzerCheckBox.setSelected(false);
    }

    public void benutzerLoeschen() throws RemoteException {


        
        int index = this.benutzerComboBox.getSelectedIndex();
        ic.deleteBenutzer(aktuellerBenutzer);
        aktuellerBenutzer = null;

        MutableComboBoxModel mcb = (MutableComboBoxModel) benutzerComboBox.getModel();
        mcb.removeElementAt(index);



        this.leereAlleFelder();

    }

    public void speichereAktuellenBenutzer() throws RemoteException {

        //abfrage ob der Benutzername bereits existiert
        if (ic.existiertBenutzerMitBenutzername(benutzernameTextField.getText(), aktuellerBenutzer)) {
            String message = (String) ("Der Benutzername: " + benutzernameTextField.getText() + " existiert bereits, geben sie einen anderen Benutzername an.");
            JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
            return;
        }


        //speichert den aktuellen Index
        int index = benutzerComboBox.getSelectedIndex();

        aktuellerBenutzer.setBenutzername(benutzernameTextField.getText());
        aktuellerBenutzer.setVorname(vornameTextField.getText());
        aktuellerBenutzer.setNachname(nachnameTextField.getText());
        aktuellerBenutzer.setEmail(emailTextField.getText());
        aktuellerBenutzer.setTelefon(telefonTextField.getText());
        aktuellerBenutzer.setRaum(raumTextField.getText());
        aktuellerBenutzer.setSuperbenutzer(superbenutzerCheckBox.isSelected());

        ic.updateBenutzer(aktuellerBenutzer);

        for (int i = 0; i < alleBenutzer.size(); i++) {
            if (aktuellerBenutzer.getBenutzerID() == alleBenutzer.elementAt(i).getBenutzerID()) {
                alleBenutzer.setElementAt(aktuellerBenutzer, i);
            }
        }

        //Diese 3 Zeilen fügen das geänderte Objekt hinzu und löschen das Alte
        MutableComboBoxModel mcb = (MutableComboBoxModel) benutzerComboBox.getModel();
        mcb.insertElementAt(aktuellerBenutzer.getBenutzername(), index);
        mcb.removeElementAt(index + 1);
    }

    public void neuenBenutzerAnlegen() throws RemoteException {
        String tempBenutzername = benutzernameTextField.getText();
        String tempVorname = vornameTextField.getText();
        String tempNachname = nachnameTextField.getText();
        String tempEmail = emailTextField.getText();
        String tempTelefon = telefonTextField.getText();
        String tempRaum = raumTextField.getText();
        boolean tempSuperbenutzer = false;

        if (superbenutzerCheckBox.isSelected()) {
            tempSuperbenutzer = true;
        }

        //abfrage ob der Benutzername bereits existiert
        for (Benutzer b : alleBenutzer) {
            if (b.getBenutzername().toLowerCase().equals(benutzernameTextField.getText().toLowerCase())) {
                String message = (String) ("Der Benutzername: " + benutzernameTextField.getText() + " existiert bereits, geben sie einen anderen Benutzername an.");
                JOptionPane.showMessageDialog(null, message, "Fehler", 2, null);
                return;
            }
        }

        Benutzer tempBenutzer = ic.createBenutzer(tempBenutzername, tempVorname, tempNachname, tempRaum, tempEmail, tempTelefon, tempSuperbenutzer);
        alleBenutzer.addElement(tempBenutzer);
        benutzerComboBox.addItem(tempBenutzer.getBenutzername());
        int tempIndex = 0;
        for (int i = 0; i < benutzerComboBox.getItemCount(); i++) {
            tempIndex = i;
        }
        aktuellerBenutzer = tempBenutzer;
        benutzerComboBox.setSelectedItem(benutzerComboBox.getItemAt(tempIndex));

        this.setTextfeld();

    }

    public void setTextfeld() throws RemoteException {
        String tempBenutzername = benutzerComboBox.getSelectedItem().toString();
        for (int i = 0; i < alleBenutzer.size(); i++) {

            if (alleBenutzer.elementAt(i).getBenutzername().equals(tempBenutzername)) {
                aktuellerBenutzer = alleBenutzer.elementAt(i);
                benutzernameTextField.setText(aktuellerBenutzer.getBenutzername());
                vornameTextField.setText(aktuellerBenutzer.getVorname());
                nachnameTextField.setText(aktuellerBenutzer.getNachname());
                emailTextField.setText(aktuellerBenutzer.getEmail());
                telefonTextField.setText(aktuellerBenutzer.getTelefon());
                raumTextField.setText(aktuellerBenutzer.getRaum());
                superbenutzerCheckBox.setSelected(false);

                if (aktuellerBenutzer.isSuperbenutzer()) {
                    superbenutzerCheckBox.setSelected(true);
                }

            }
        }
        if (aktuellerBenutzer != null) {
            benutzernameTextField.setText(aktuellerBenutzer.getBenutzername());
            vornameTextField.setText(aktuellerBenutzer.getVorname());
            nachnameTextField.setText(aktuellerBenutzer.getNachname());
            emailTextField.setText(aktuellerBenutzer.getEmail());
            telefonTextField.setText(aktuellerBenutzer.getTelefon());
            raumTextField.setText(aktuellerBenutzer.getRaum());
            superbenutzerCheckBox.setSelected(false);

            if (aktuellerBenutzer.isSuperbenutzer()) {
                superbenutzerCheckBox.setSelected(true);
            }
        }
    }
}

